package com.haiyou.common.response;

import com.haiyou.common.constant.MessageCode;
import io.swagger.annotations.ApiModel;
import lombok.Data;

/**
 * 响应结果实体
 *
 * @author chenzeke
 * @date 2020/2/26 16:12
 */
@ApiModel(value = "响应结果实体")
@Data
public class ResponseResult<T> {
    private T data;
    private String message;
    private int code;

    /**
     * 构造器私有化1
     */
    private ResponseResult(MessageCode messageCode) {
        this.message = messageCode.getMessage();
        this.code = messageCode.getCode();
    }

    /**
     * 构造器私有化2
     */
    private ResponseResult(MessageCode messageCode, String message) {
        this.message = message;
        this.code = messageCode.getCode();
    }

    /**
     * 构造器私有化2
     */
    private ResponseResult(MessageCode messageCode, String message, T object) {
        this.message = message;
        this.code = messageCode.getCode();
        this.data = object;
    }

    /**
     * 构造器私有化3
     *
     * @param data 响应数据
     */
    private ResponseResult(T data) {
        this.message = MessageCode.SUCCESS.getMessage();
        this.code = MessageCode.SUCCESS.getCode();
        this.data = data;
    }

    /**
     * 成功返回
     *
     * @param data 对象
     * @param <T>  泛型
     * @return 返回结果
     */
    public static <T> ResponseResult<T> ok(T data) {
        return new ResponseResult<>(data);
    }

    /**
     * 失败返回
     *
     * @param messageCode 消息状态码枚举
     * @param <T>         泛型
     * @return 返回结果
     */
    public static <T> ResponseResult<T> error(MessageCode messageCode) {
        return new ResponseResult<>(messageCode);
    }

    /**
     * 失败返回
     *
     * @param message 消息
     * @param <T>         泛型
     * @return 返回结果
     */
    public static <T> ResponseResult<T> error(String message) {
        return new ResponseResult<>(MessageCode.ERROR, message);
    }

    /**
     * 失败返回，扩展错误消息
     *
     * @param messageCode 消息状态码枚举
     * @param <T>         泛型
     * @return 返回结果
     */
    public static <T> ResponseResult<T> error(MessageCode messageCode, String message) {
        return new ResponseResult<>(messageCode, message);
    }

    /**
     * 失败返回，扩展错误消息
     *
     * @param code 消息状态码
     * @param <T>  泛型
     * @return 返回结果
     */
    public static <T> ResponseResult<T> error(int code, String message, T object) {
        ResponseResult<T> responseResult = new ResponseResult<>(MessageCode.ERROR, message);
        responseResult.setCode(code);
        responseResult.setData(object);
        return responseResult;
    }

    /**
     * 失败返回，扩展错误消息，错误状态码
     *
     * @param code 状态码
     * @param <T>  泛型
     * @return 返回结果
     */
    public static <T> ResponseResult<T> error(int code, String message) {
        ResponseResult<T> responseResult = new ResponseResult<>(MessageCode.ERROR, message);
        responseResult.setCode(code);
        return responseResult;
    }


}
